#pragma once
#include "stdafx.h"
#include <vector>
#include "vec3.h"
#include "vec2.h"

using namespace std;

struct Vertex
{
	float pos[3];
	float texcoord[2];
	float normal[3];
	float color[4];
	GLubyte padding[16];	// to make the struct 64 bytes
};

class VBO_Data
{
public:
	vector<Vertex> vertices;
	uint id, mode;
	bool hasNormal, hasTexCoord, hasColor;

	VBO_Data()
		: hasTexCoord(false)
		, hasNormal(false)
		, hasColor(false)
	{};
	~VBO_Data() {};
};

class VBO
{
	//	How to use :
	//		VBO vbo;						// Create a VBO
	//		void Init(void)
	//		{			
	//			vec3 vertices =				// Specify vertices
	//			{
	//				vec3(0,0,0), vec3(1,0,0), vec3(1,1,0)
	//			};
	//			
	//			vbo.Begin(GL_TRIANGLES);	// Begin pushing in vertices
	//			vbo.AddTriangle(vertices);	// Push in our vertices
	//			vbo.End();	// End and upload vertice data
	//		}
	//
	//		void Draw(void)
	//		{
	//			vbo.Draw();					// Just call this to draw
	//		}

private:
	vector<VBO_Data*> vbos;
	bool bAcceptingVertexData;

public:
	VBO(void) : bAcceptingVertexData(false) {};
	~VBO(void);

	GLuint Begin(GLenum mode);
	void End(GLenum usage = GL_STATIC_DRAW);
	void UpdateBegin(GLuint id);
	void UpdateEnd(GLuint id);
	void Draw(void);

	void AddVertex(vec3 v);
	void AddVertex(float x, float y, float z);
	void AddVertex(float *v);

	void AddNormal(vec3 v);
	void AddNormal(float x, float y, float z);
	void AddNormal(float *v);

	void AddTexCoord(vec2 v);
	void AddTexCoord(float u, float v);
	void AddTexCoord(float *v);

	void AddColor(vec3 v, float a = 1.0f);
	void AddColor(float r, float g, float b, float a = 1.0f);
	void AddColor(float *v);

	void SetColor(GLuint vbo_id, float r, float g, float b, float a = 1.0f);
};